// src/api/s3.js
import apiClient from './index';

/**
 * 批量删除文件或文件夹
 * @param {string} bucketName - 桶名称
 * @param {string[]} items - 要删除的项目key的数组 (文件夹以 '/' 结尾)
 * @returns {Promise}
 */
export const deleteBucketItems = (bucketName, items) => {
    return apiClient.post(`/api/v1/buckets/${bucketName}/delete-items`, {
        items: items
    });
};

/**
 * 【新增】下载文件或文件夹（单个或批量）
 * 后端会返回一个 zip 文件流
 * @param {string} bucketName - 桶名称
 * @param {string[]} items - 要下载的项目key的数组 (文件夹以 '/' 结尾)
 * @param {string} currentPath - 当前路径，用于生成zip文件名
 * @returns {Promise<void>}
 */
export const downloadBucketItems = async (bucketName, items, currentPath = '') => {
    const formData = new FormData();
    formData.append('bucket_name', bucketName);
    formData.append('selected_items', items.join(',')); // 将数组转为逗号分隔的字符串
    formData.append('current_path', currentPath);

    try {
        const response = await apiClient.post(
            '/api/v1/batch_download_items',
            formData,
            {
                // 告诉 axios 期望接收的是二进制数据流
                responseType: 'blob',
            }
        );

        // --- 处理返回的文件流 ---
        const blob = new Blob([response.data], { type: response.headers['content-type'] });

        // 从响应头中解析文件名
        let filename = `${bucketName}_download.zip`; // 默认文件名
        const contentDisposition = response.headers['content-disposition'];
        if (contentDisposition) {
            // 优先匹配 UTF-8 编码的文件名
            const filenameMatch = contentDisposition.match(/filename\*?=UTF-8''(.+)/);
            if (filenameMatch && filenameMatch.length > 1) {
                filename = decodeURIComponent(filenameMatch[1]);
            } else {
                // 否则匹配普通文件名
                const filenameMatchSimple = contentDisposition.match(/filename="(.+)"/);
                if (filenameMatchSimple && filenameMatchSimple.length > 1) {
                    filename = filenameMatchSimple[1];
                }
            }
        }

        // 创建一个隐藏的 <a> 标签来触发浏览器下载
        const link = document.createElement('a');
        link.href = window.URL.createObjectURL(blob);
        link.download = filename;
        document.body.appendChild(link);
        link.click();

        // 下载后进行清理
        window.URL.revokeObjectURL(link.href);
        document.body.removeChild(link);

    } catch (error) {
        console.error('下载失败:', error);
        // 如果后端没有返回文件流，而是返回了JSON格式的错误信息，我们需要解析它
        if (error.response && error.response.data.toString() === '[object Blob]') {
            const errorText = await error.response.data.text();
            try {
                const errorJson = JSON.parse(errorText);
                // 抛出一个带有明确错误信息的新Error，方便上层捕获
                throw new Error(errorJson.error || '下载时发生未知错误');
            } catch (e) {
                throw new Error(errorText || '下载时发生未知错误');
            }
        }
        throw error; // 其他网络等错误直接抛出
    }
};

// 未来还可以添加其他API函数...
// export const renameBucketItem = ...